
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Redis 的网络事件处理器 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>Redis 的网络事件处理器 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">Redis 使用什么核心模型来处理网络请求？其主要特点是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Redis 使用事件驱动模型来处理网络事件，这意味着它采用异步非阻塞的方式来处理所有客户端请求。</div>
          </div>
          <div class="card-source">来源: 1. 事件驱动模型</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">Redis 的事件驱动模型由哪两个关键组件构成？它们各自的作用是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">事件驱动模型的两个关键组件是：1. 事件循环 (Event Loop)，它是处理事件的核心，持续运行并检查是否有新事件。2. 事件分发器 (Event Dispatcher)，负责将不同类型的事件分发给相应的处理器。</div>
          </div>
          <div class="card-source">来源: 1. 事件驱动模型</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">为了高效处理多个客户端连接，Redis 采用了什么关键技术？这项技术如何帮助减少开销？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Redis 使用 I/O 多路复用技术。这项技术允许单个线程监视多个网络连接的读写状态，从而减少了线程上下文切换的开销。</div>
          </div>
          <div class="card-source">来源: 2. I/O 多路复用</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">Redis 在主流操作系统（如 Linux 和 macOS）上默认使用哪些高效的 I/O 多路复用机制？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">在 Linux 系统上，Redis 默认使用 epoll；在 macOS 和 BSD 系统上，则使用 kqueue。在不支持这两种机制的环境下，会回退使用 select 或 poll。</div>
          </div>
          <div class="card-source">来源: 2. I/O 多路复用</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">请概括 Redis 处理一个网络请求的完整流程。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">处理流程主要包括四个步骤：1. 注册事件：为客户端连接注册读写事件。2. 事件循环：等待并处理被触发的事件。3. 请求解析和处理：将客户端数据解析为命令并执行。4. 发送响应：将执行结果发送回客户端。</div>
          </div>
          <div class="card-source">来源: 3. 事件处理流程</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">尽管 Redis 的核心是单线程的，但从 Redis 6.0 开始引入了什么机制来分担主线程的 I/O 压力？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">从 Redis 6.0 开始，引入了 I/O 线程的概念，其目的是为了减少主线程在处理大数据量 I/O 操作时的阻塞。</div>
          </div>
          <div class="card-source">来源: 4. 多线程支持</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">Redis 网络事件处理器能够实现高并发处理的关键原因有哪些？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">主要得益于三个方面：1. 事件循环机制，减少了线程上下文切换的开销；2. 非阻塞 I/O，允许服务器在等待时处理其他任务；3. 高效的 I/O 多路复用机制（如 epoll 和 kqueue）。</div>
          </div>
          <div class="card-source">来源: 5. 高并发处理</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">什么是 Redis 的管道化（Pipelining）技术？它主要用于优化什么问题？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">管道化（Pipelining）是一项性能优化技术，它允许客户端一次性发送多个命令，从而有效减少了因多次网络往返而产生的网络延迟。</div>
          </div>
          <div class="card-source">来源: 6. 性能优化</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">在 Redis 的事件处理流程中，当一个读事件被触发后，相应的处理函数会执行哪些主要任务？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">当读事件被触发，事件处理函数会首先读取客户端的请求数据，然后将这些数据解析成 Redis 命令，最后执行命令并生成响应。</div>
          </div>
          <div class="card-source">来源: 3. 事件处理流程</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
